
--=============================================================================--
-- 这个时间点 我已经知道简单的封装了
-- 在这个游戏中，主角被封装为单独的一个类
--=============================================================================--

--=============================================================================--
-- ■ 加载运行库
--=============================================================================--
require "Lib/engine"
require "Sys/扩展_机械文字"
require "Sys/扩展子弹类"
require "Sys/主角"
require "Sys/数学函数"

--===============================================================================
-- ■ 初始化屏幕
--===============================================================================
引擎  = D2D_引擎.创建("特种行动--*****",50,800,600,true,true,"Dat/图标.ico")

文字= D2D_文字.创建("宋体",30,false,false,false)

中字= D2D_文字.创建("黑体",40,false,false,false)

大字= D2D_文字.创建("黑体",60,false,false,false)

血量显示=D2D_机械文字.创建()

----地图部分
地图图片={}
地图精灵={}

for n=1,tonumber(读配置项("Dat/配置.ini","地图总数","地图总数")) do
	地图图片[n]=引擎:载入图片("Dat/地图/" .. 读配置项("Dat/配置.ini","地图名称",tostring(n)))
	地图精灵[n]=D2D_精灵.创建(地图图片[n],0,0,100,100)
end

----地图部分完
--===============================================================================
--其他资源载入
开始图片=引擎:载入图片("Dat/背景.jpg")
帮助图片=引擎:载入图片("Dat/帮助.png")
开始前景=引擎:载入图片("Dat/主界面.png")
UI素材图片=引擎:载入图片("Dat/ui_default_loading_bar.png")
子弹图片=引擎:载入图片("Dat/蛇身.png")
子弹图片2=引擎:载入图片("Dat/white-ball.png")
子弹图片3=引擎:载入图片("Dat/bullet.png")
粒子素材=引擎:载入图片("Dat/particles.png")
地雷图片=引擎:载入图片("Dat/地雷.png")
背景图片=引擎:载入图片("Dat/背景图片.jpg")
建筑图片=引擎:载入图片("Dat/建筑.png")
树图片=引擎:载入图片("Dat/树.png")
其他素材=引擎:载入图片("Dat/素材.png")
炮塔3图片=引擎:载入图片("Dat/炮塔3.png")

--一些精灵
背景精灵=D2D_精灵.创建(背景图片,0,0,800,600)

--主角创建
主角=主角.创建()

--============================================================
--音效部分----
子弹音效1= D2D_音效.创建("Dat/tankfire.mp3") ----敌人飞机
子弹音效2= D2D_音效.创建("Dat/炮.mp3") ----坦克炮
子弹音效3= D2D_音效.创建("Dat/火箭.mp3") ----主角子弹3
胜利= D2D_音效.创建("Dat/胜.mp3")
失败= D2D_音效.创建("Dat/败.WAV")
爆炸音效1=D2D_音效.创建("Dat/爆.mp3") ----失败
爆炸音效2=D2D_音效.创建("Dat/爆炸.WAV") ----坦克报废
爆炸音效3=D2D_音效.创建("Dat/高爆.mp3") ----建筑倒塌

背景音效=D2D_音效.创建("Dat/背景音效.mp3")
背景音效:播放_高级(50,true,1)

--数据初始
游戏状态="开始"
当前关卡=1
地图x=0
地图y=0
载入临时=0
任务计数=0
任务总数=tonumber(读配置项("Dat/配置.ini",tostring(当前关卡),"目标数量"))

坦克计数=0

--全局常量引入
mt=tonumber(读配置项("Dat/配置.ini",tostring(当前关卡),"坦克上限"))
mf=tonumber(读配置项("Dat/配置.ini",tostring(当前关卡),"飞机上限"))

载入速度=tonumber(读配置项("Dat/配置.ini","全局设置","地图载入速度"))*50


--不初始数据
主角子弹组={}
敌人子弹组={}
地图物件组={}
敌人组={}
坦克组={}
飞机组={}
地雷组={}
P=0.017453

----游戏特效
帮助精灵=D2D_精灵.创建(帮助图片,0,0,400,200)

粒子精灵=D2D_精灵.创建(粒子素材,0,0,32,32)
粒子精灵:置混合模式(1)

滚动框背景精灵	 = D2D_精灵.创建(UI素材图片,1,57,250,30)
填充精灵			 = D2D_精灵.创建(UI素材图片,1,29,26,26)
填充头精灵		 = D2D_精灵.创建(UI素材图片,84,30,7,24)

开始精灵= D2D_精灵.创建(开始图片,0,0,400,300)
开始精灵2= D2D_精灵.创建(开始前景,0,0,400,300)
开始按键=D2D_包围盒.创建(0,0,120,60)

临时x=0
临时y=0

类型x1=0
临时y1=0

胜利计时=0
失败计时=0

鼠标x=0
鼠标y=0

爆炸组={}

通关计时=50

--===============================================================================
-- ■ 屏幕逻辑()
--===============================================================================
function 屏幕逻辑 ()
	
	时间=引擎:取最后帧时间()
	
	主角:更新()
	
	鼠标x,鼠标y = 引擎:取鼠标坐标 ()
	
	----载入地图
if(游戏状态=="载入地图")then
	坦克计数=0
	任务总数=tonumber(读配置项("Dat/配置.ini",tostring(当前关卡),"目标数量"))
	mt=tonumber(读配置项("Dat/配置.ini",tostring(当前关卡),"坦克上限"))
	mf=tonumber(读配置项("Dat/配置.ini",tostring(当前关卡),"飞机上限"))	
	for a=-1,tonumber(读配置项("Dat/配置.ini","地图大小",tostring(当前关卡))) do
		for b=-1,tonumber(读配置项("Dat/配置.ini","地图大小",tostring(当前关卡))) do
			if(地图精灵[当前关卡]:取像素值(a,b)==(ARGB(255,100,0,0)))then
				local 地图物件={
					精灵=D2D_精灵.创建(建筑图片,0,0,200,200),
					包围盒=D2D_包围盒.创建(0,0,180,120),
					x=a*100+100,
					y=b*100+100,
					类型="坦克工厂",
					血量=100,
					生产计时=300,
				}
				地图物件.精灵:置中心点(100,100)
				table.insert(地图物件组,地图物件)
			end
			if(地图精灵[当前关卡]:取像素值(a,b)==(ARGB(255,100,100,0)))then
				local 地图物件={
					精灵=D2D_精灵.创建(建筑图片,200,0,200,200),
					包围盒=D2D_包围盒.创建(0,0,196,196),
					x=a*100+100,
					y=b*100+100,
					类型="飞机工厂",
					血量=100,
					生产计时=600,
				}
				地图物件.精灵:置中心点(100,100)
				table.insert(地图物件组,地图物件)
			end
			if(地图精灵[当前关卡]:取像素值(a,b)==(ARGB(255,100,100,100)))then
				local 地图物件={
					精灵=D2D_精灵.创建(建筑图片,400,0,200,200),
					包围盒=D2D_包围盒.创建(0,0,196,196),
					x=a*100+100,
					y=b*100+100,
					类型="指挥部",
					血量=200
				}
				地图物件.精灵:置中心点(100,100)
				table.insert(地图物件组,地图物件)
			end
			if(地图精灵[当前关卡]:取像素值(a,b)==(ARGB(255,0,0,100)))or(a==-1)or(a==tonumber(读配置项("Dat/配置.ini","地图大小",tostring(当前关卡))))or(b==-1)or(b==tonumber(读配置项("Dat/配置.ini","地图大小",tostring(当前关卡))))then
				local 地图物件={
					精灵=D2D_精灵.创建(树图片,10,0,100,147),
					包围盒=D2D_包围盒.创建(0,0,100,100),
					x=a*100,
					y=b*100-47,
					类型="树",
					血量=20
				}
				table.insert(地图物件组,地图物件)
			end
			if(地图精灵[当前关卡]:取像素值(a,b)==(ARGB(255,100,0,100)))then
				local 敌人={
					精灵=D2D_精灵.创建(其他素材,413,0,64,64),
					精灵2=D2D_精灵.创建(其他素材,123,0,38,64),
					包围盒=D2D_包围盒.创建(0,0,64,64),
					x=a*100+50,
					y=b*100+50,
					方向=0,
					方向2=0,
					类型="炮",
					血量=100,
					攻击冷却=100
				}
				敌人.精灵:置中心点(32,32)
				敌人.精灵2:置中心点(19,19)
				table.insert(敌人组,敌人)
			end
			if(地图精灵[当前关卡]:取像素值(a,b)==(ARGB(255,0,100,100)))then
				local 地雷={
					精灵=D2D_精灵.创建(地雷图片,0,0,32,32),
					包围盒=D2D_包围盒.创建(0,0,32,32),
					x=a*100+34,
					y=b*100+34
				}
				地雷.精灵:置颜色(ARGB(100,0,0,0))
				table.insert(地雷组,地雷)
			end
		end
	end
	主角.主角.x=tonumber(读配置项("Dat/配置.ini",tostring(当前关卡),"初始位置x"))*100+50
	主角.主角.y=tonumber(读配置项("Dat/配置.ini",tostring(当前关卡),"初始位置y"))*100+50
	地图x=400-主角.主角.x
	地图y=300-主角.主角.y
	游戏状态="载入地图2"
end
	
	----地图载入完
	
	

	
	

	
	
	return false
end




--===============================================================================
-- ■ 屏幕渲染()
--===============================================================================
function 屏幕渲染 ()
	渲染开始()
	清屏(ARGB(255,128,128,128))
	
	if(游戏状态=="开始")then
		开始精灵:显示_高级(0,0,0,2,2)  
		开始精灵2:显示_高级(0,100,0,1.8,1.8) 
		文字_描边显示(大字,400,0,"特",ARGB(255,255,201,14),ARGB(255,255,0,255))
		文字_描边显示(大字,500,100,"种",ARGB(255,255,201,14),ARGB(255,255,0,255))
		文字_描边显示(大字,600,50,"行",ARGB(255,255,201,14),ARGB(255,255,0,255))
		文字_描边显示(大字,700,150,"动",ARGB(255,255,201,14),ARGB(255,255,0,255))
		文字_描边显示(大字,300,500,"开始",ARGB(255,255,0,0),ARGB(255,0,0,0))
		开始按键:置位置(300,500)
		if(开始按键:检测_点(鼠标x,鼠标y))then
			文字_描边显示(大字,300,500,"开始",ARGB(255,0,0,0),ARGB(255,255,0,0))
			if(引擎:取按键按下(键_鼠标左))then
				游戏状态="清空"
			end
		end
	end
	
	if(游戏状态=="载入地图")or(游戏状态=="清空")then
		开始精灵:显示_高级(0,0,0,2,2)  
		文字_描边显示2(文字,210,250,"!正在初始化,请稍候!",ARGB(255,0,0,0),ARGB(255,255,255,255))
	end
	
	if(游戏状态=="载入地图2")then
		开始精灵:显示_高级(0,0,0,2,2)  
		帮助精灵:显示(200,100)
		if(载入临时<=载入速度)then
			载入临时=载入临时+1
			文字_描边显示2(文字,340,350,"!载入中!",ARGB(255,0,0,0),ARGB(255,255,255,255))
		else
			文字_描边显示2(文字,400-8*string.len(读配置项("Dat/配置.ini",tostring(当前关卡),"任务描述")),400,读配置项("Dat/配置.ini",tostring(当前关卡),"任务描述"),ARGB(255,288,0,0),ARGB(255,0,0,255))
			文字_描边显示2(文字,240,350,"!载入完毕,点击开始!",ARGB(255,0,0,0),ARGB(255,255,255,255))
			if(引擎:取按键按下(键_鼠标左))then
				游戏状态="战斗"
				载入临时=0
			end
		end
		填充精灵:显示_高级(270,500,0,载入临时* 242/(26*载入速度),1)  
		填充头精灵:显示(270+载入临时*242/载入速度 -4,501)  
		滚动框背景精灵:显示(270,500)
		
	end

	----胜负界面----
	if(游戏状态=="胜")then
		开始精灵:显示_高级(0,0,0,2,2)  
		文字_描边显示2(文字,240,350,"!恭喜通关,点击继续!",ARGB(255,0,0,0),ARGB(255,255,255,255))
		if(引擎:取按键按下(键_鼠标左))then
			初始化()
			当前关卡=当前关卡+1
			if(当前关卡<tonumber(读配置项("Dat/配置.ini","地图总数","地图总数")))then
				游戏状态="清空"
			else
				游戏状态="通关"
			end
		end
	end
	if(游戏状态=="输")then
		开始精灵:显示_高级(0,0,0,2,2)  
		文字_描边显示2(文字,200,350,"!胜败兵家常事,点击继续!",ARGB(255,0,0,0),ARGB(255,255,255,255))
		if(引擎:取按键按下(键_鼠标左))then
			初始化()
			当前关卡=1
			游戏状态="开始"
		end
	end
	if(游戏状态=="通关")then
		通关计时=通关计时-1
		开始精灵:显示_高级(0,0,0,2,2)  
		文字_描边显示2(文字,180,280,"!祝贺你已完成所有关卡,点击继续!",ARGB(255,0,0,0),ARGB(255,255,255,255))
		if(引擎:取按键按下(键_鼠标左))and(通关计时<0)then
			初始化()
			当前关卡=1
			游戏状态="开始"
			通关计时=50
		end
	end
	----战斗代码----
	
	
	if(游戏状态=="战斗")then
	
	----地图显示----
	背景精灵:置显示区域(-地图x,-地图y,800,600)
	背景精灵:显示()
	
	
	--敌人坦克
	for n=1,table.getn(敌人组) do
		敌人组[n].精灵:显示_高级(地图x+敌人组[n].x,地图y+敌人组[n].y,敌人组[n].方向*P,1,1)
		敌人组[n].精灵2:显示_高级(地图x+敌人组[n].x,地图y+敌人组[n].y,敌人组[n].方向2*P,1,1)
		
		敌人组[n].包围盒:置位置(地图x+敌人组[n].x-32,地图y+敌人组[n].y-32)
		
		if(敌人组[n].攻击冷却>=0)then
			敌人组[n].攻击冷却=敌人组[n].攻击冷却-1
		end
		
		if(敌人组[n].类型=="炮")then
			
			--击中--
				for m=1,table.getn(主角子弹组) do
					if(敌人组[n].包围盒:检测_点(主角子弹组[m].子弹.起点x+地图x,主角子弹组[m].子弹.起点y+地图y))then
						if(主角子弹组[m].类型==1)then
							敌人组[n].血量=敌人组[n].血量-10
						end
						if(主角子弹组[m].类型==2)then
							敌人组[n].血量=敌人组[n].血量-50
						end
						if(主角子弹组[m].类型==3)then
							break
						end
						local 临时爆炸={
							x=地图x+敌人组[n].x,
							y=地图y+敌人组[n].y,
							类型=D2D_粒子.创建("Dat/爆炸.psi",粒子精灵),
							倒计时=50
						}
						table.insert(爆炸组,临时爆炸)
						table.remove(主角子弹组,n)
						break
					end
				end
				
				
			
			if(取距离平方(地图x+敌人组[n].x,地图y+敌人组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)<550*550)then
				--攻击代码
				
				if(取距离平方(地图x+敌人组[n].x,地图y+敌人组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)<500*500)and(敌人组[n].攻击冷却<0)then
					if((取两点间角度(地图x+敌人组[n].x,地图y+敌人组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)-95)%360<敌人组[n].方向2%360)and((取两点间角度(地图x+敌人组[n].x,地图y+敌人组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)-85)%360>敌人组[n].方向2%360)then
						
						临时x,临时y=取移动步幅(敌人组[n].方向2+90)
						
						local 子弹={
							子弹=扩展子弹类.创建(敌人组[n].x+临时x*40,敌人组[n].y+临时y*40,敌人组[n].方向2+90,D2D_精灵.创建(子弹图片,0,0,16,16),6),
							射程=500,
							类型=2
						}
						table.insert(敌人子弹组,子弹)
						敌人组[n].攻击冷却=100
						子弹音效2:播放()
					else
						if((取两点间角度(地图x+敌人组[n].x,地图y+敌人组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)-敌人组[n].方向2-90)%360>180)then
							敌人组[n].方向2=敌人组[n].方向2-3
						else	
							敌人组[n].方向2=敌人组[n].方向2+3
						end
					end
				end
				
			else
				if(敌人组[n].方向2%360>180)then
					敌人组[n].方向2=敌人组[n].方向2-3
				else	
					敌人组[n].方向2=敌人组[n].方向2+3
				end
			end
		end
		
		if(敌人组[n].类型=="坦克")then
			----产生
			if(敌人组[n].临时>0)then
				敌人组[n].临时=敌人组[n].临时-3
				敌人组[n].y=敌人组[n].y+3
			end
			
			----击中
			for m=1,table.getn(主角子弹组) do
				if(敌人组[n].包围盒:检测_点(主角子弹组[m].子弹.起点x+地图x,主角子弹组[m].子弹.起点y+地图y))then
					if(主角子弹组[m].类型==2)then
						敌人组[n].血量=敌人组[n].血量-10
					end
					if(主角子弹组[m].类型==1)then
						敌人组[n].血量=敌人组[n].血量-50
					end
					if(主角子弹组[m].类型==3)then
						break
					end
					local 临时爆炸={
						x=地图x+敌人组[n].x,
						y=地图y+敌人组[n].y,
						类型=D2D_粒子.创建("Dat/爆炸.psi",粒子精灵),
						倒计时=50
					}
					table.insert(爆炸组,临时爆炸)
					table.remove(主角子弹组,n)
					break
				end
			end
			
			----防碰撞
			for a=1,table.getn(敌人组) do
				if(a==n)then
					break
				end
				if(引擎:包围盒碰撞检测(敌人组[n].包围盒,敌人组[a].包围盒))then
					if(敌人组[a].类型=="坦克")then
						敌人组[n].x1,敌人组[n].y1=取移动步幅(敌人组[n].方向+90)
						敌人组[n].x=敌人组[n].x-敌人组[n].x1*4
						敌人组[n].y=敌人组[n].y-敌人组[n].y1*4
						敌人组[a].x1,敌人组[a].y1=取移动步幅(敌人组[a].方向+90)
						敌人组[a].x=敌人组[a].x+敌人组[a].x1*4
						敌人组[a].y=敌人组[a].y+敌人组[a].y1*4
					else
						敌人组[n].x1,敌人组[n].y1=取移动步幅(敌人组[n].方向+90)
						敌人组[n].x=敌人组[n].x+敌人组[n].x1*4
						敌人组[n].y=敌人组[n].y+敌人组[n].y1*4
					end
				end
			end
			
			
			----移动
			if(取距离平方(地图x+敌人组[n].x,地图y+敌人组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)>400*400)and(取距离平方(地图x+敌人组[n].x,地图y+敌人组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)<1000*1000)then
				
				if((取两点间角度(地图x+敌人组[n].x,地图y+敌人组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)+70)%360<敌人组[n].方向%360)and((取两点间角度(地图x+敌人组[n].x,地图y+敌人组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)+110)%360>敌人组[n].方向%360)then
					
					
					临时x,临时y=取移动步幅(敌人组[n].方向+90)
					敌人组[n].x=敌人组[n].x-临时x*2
					敌人组[n].y=敌人组[n].y-临时y*2
					
					敌人组[n].包围盒:置位置(地图x+敌人组[n].x-32,地图y+敌人组[n].y-32)
					
					for m=1,table.getn(地图物件组) do
						if(引擎:包围盒碰撞检测(地图物件组[m].包围盒,敌人组[n].包围盒))then
							敌人组[n].x=敌人组[n].x+临时x*2
							敌人组[n].y=敌人组[n].y+临时y*2
						end
					end
					
				else
					if((取两点间角度(地图x+敌人组[n].x,地图y+敌人组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)-敌人组[n].方向+90)%360>180)then
						敌人组[n].方向=敌人组[n].方向-2
					else	
						敌人组[n].方向=敌人组[n].方向+2
					end
				end
			end
				
			----攻击
			if(取距离平方(地图x+敌人组[n].x,地图y+敌人组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)<550*550)then
				--攻击代码
				
				if(取距离平方(地图x+敌人组[n].x,地图y+敌人组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)<400*400)and(敌人组[n].攻击冷却<0)then
					if((取两点间角度(地图x+敌人组[n].x,地图y+敌人组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)-95)%360<敌人组[n].方向2%360)and((取两点间角度(地图x+敌人组[n].x,地图y+敌人组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)-85)%360>敌人组[n].方向2%360)then
						
						临时x,临时y=取移动步幅(敌人组[n].方向2+90)
						
						local 子弹={
							子弹=扩展子弹类.创建(敌人组[n].x+临时x*84,敌人组[n].y+临时y*84,敌人组[n].方向2+90,D2D_精灵.创建(子弹图片2,0,0,16,16),6),
							射程=400,
							类型=1
						}
						table.insert(敌人子弹组,子弹)
						敌人组[n].攻击冷却=100
						子弹音效2:播放()
					else
						if((取两点间角度(地图x+敌人组[n].x,地图y+敌人组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)-敌人组[n].方向2-90)%360>180)then
							敌人组[n].方向2=敌人组[n].方向2-2
						else	
							敌人组[n].方向2=敌人组[n].方向2+2
						end
					end
				end
				
			else
				
				if(敌人组[n].方向2>0)then
					敌人组[n].方向2=敌人组[n].方向2-3
				else	
					敌人组[n].方向2=敌人组[n].方向2+3
				end
			end
				
				
		end
		
		
		if(敌人组[n].血量<0)then
			for x=1,5 do
				local 临时爆炸={
					x=地图x+敌人组[n].x+引擎:取随机整数(-100,100),
					y=地图y+敌人组[n].y+引擎:取随机整数(-100,100),
					类型=D2D_粒子.创建("Dat/爆炸.psi",粒子精灵),
					倒计时=50
				}
				table.insert(爆炸组,临时爆炸)
			end
			if(敌人组[n].类型=="坦克")then
				坦克计数=坦克计数-1
			end
			爆炸音效2:播放()
			table.remove(敌人组,n)
			break
		end
		
	end
	
	
	--主角
	主角:显示()
	
	----地图物件----
	for n=1,table.getn(地图物件组) do
		地图物件组[n].精灵:显示(地图x+地图物件组[n].x,地图y+地图物件组[n].y)
		if(地图物件组[n].类型=="坦克工厂")then
			地图物件组[n].包围盒:置位置(地图x+地图物件组[n].x-93,地图y+地图物件组[n].y-56)
			----坦克出现
			if(地图物件组[n].生产计时<0)and(坦克计数<mt)then
				local 敌人={
					精灵=D2D_精灵.创建(其他素材,330,0,64,94),
					精灵2=D2D_精灵.创建(其他素材,210,0,35,86),
					包围盒=D2D_包围盒.创建(0,0,64,64),
					x=地图物件组[n].x,
					y=地图物件组[n].y,
					x1=0,
					x2=0,
					方向=180,
					方向2=0,
					类型="坦克",
					血量=70,
					攻击冷却=50,
					临时=150
				}
				敌人.精灵:置中心点(32,49)
				敌人.精灵2:置中心点(17,17)
				table.insert(敌人组,敌人)
				坦克计数=坦克计数+1
				地图物件组[n].生产计时=300
			else
				地图物件组[n].生产计时=地图物件组[n].生产计时-1
			end
		end
		if(地图物件组[n].类型=="飞机工厂")then
			地图物件组[n].包围盒:置位置(地图x+地图物件组[n].x-98,地图y+地图物件组[n].y-98)
			if(地图物件组[n].生产计时<0)and(table.getn(飞机组)<mf)then
				local 敌人={
					精灵=D2D_精灵.创建(其他素材,572,0,64,94),
					精灵2=D2D_精灵.创建(其他素材,490,0,60,90),
					包围盒=D2D_包围盒.创建(0,0,56,56),
					x=地图物件组[n].x,
					y=地图物件组[n].y,
					x1=0,
					x2=0,
					方向=180,
					方向2=0,
					类型="飞机",
					血量=40,
					攻击冷却=50,
					临时=150
				}
				敌人.精灵:置中心点(32,23)
				敌人.精灵2:置中心点(33,40)
				table.insert(飞机组,敌人)
				地图物件组[n].生产计时=600
			else
				地图物件组[n].生产计时=地图物件组[n].生产计时-1
			end
		end
		if(地图物件组[n].类型=="指挥部")then
			地图物件组[n].包围盒:置位置(地图x+地图物件组[n].x-98,地图y+地图物件组[n].y-98)
		end
		if(地图物件组[n].类型=="树")then
			地图物件组[n].包围盒:置位置(地图x+地图物件组[n].x,地图y+地图物件组[n].y+47)
			for m=1,table.getn(主角子弹组) do
				if(地图物件组[n].包围盒:检测_点(主角子弹组[m].子弹.起点x+地图x,主角子弹组[m].子弹.起点y+地图y))then
					if(主角子弹组[m].类型==1)or(主角子弹组[m].类型==2)then
						local 临时爆炸={
							x=地图x+地图物件组[n].x+50,
							y=地图y+地图物件组[n].y+50,
							类型=D2D_粒子.创建("Dat/爆炸.psi",粒子精灵),
							倒计时=50
						}
						table.insert(爆炸组,临时爆炸)
						table.remove(主角子弹组,n)
						break
					end
				end
			end
			for m=1,table.getn(敌人子弹组) do
				if(地图物件组[n].包围盒:检测_点(敌人子弹组[m].子弹.起点x+地图x,敌人子弹组[m].子弹.起点y+地图y))then
					if(敌人子弹组[m].类型==1)or(敌人子弹组[m].类型==2)then
						local 临时爆炸={
							x=地图x+地图物件组[n].x+50,
							y=地图y+地图物件组[n].y+50,
							类型=D2D_粒子.创建("Dat/爆炸.psi",粒子精灵),
							倒计时=50
						}
						table.insert(爆炸组,临时爆炸)
						table.remove(敌人子弹组,n)
						break
					end
				end
			end
		else
			for m=1,table.getn(主角子弹组) do
				if(地图物件组[n].包围盒:检测_点(主角子弹组[m].子弹.起点x+地图x,主角子弹组[m].子弹.起点y+地图y))then
					if(主角子弹组[m].类型==1)then
						地图物件组[n].血量=地图物件组[n].血量-10
					end
					if(主角子弹组[m].类型==2)then
						地图物件组[n].血量=地图物件组[n].血量-50
					end
					if(主角子弹组[m].类型==3)then
						break
					end
					local 临时爆炸={
						x=地图x+地图物件组[n].x,
						y=地图y+地图物件组[n].y,
						类型=D2D_粒子.创建("Dat/爆炸.psi",粒子精灵),
						倒计时=50
					}
					table.insert(爆炸组,临时爆炸)
					table.remove(主角子弹组,n)
					break
				end
			end
			for m=1,table.getn(敌人子弹组) do
				if(地图物件组[n].包围盒:检测_点(敌人子弹组[m].子弹.起点x+地图x,敌人子弹组[m].子弹.起点y+地图y))then
					
					if(敌人子弹组[m].类型==3)then
						break
					end
					local 临时爆炸={
						x=地图x+地图物件组[n].x,
						y=地图y+地图物件组[n].y,
						类型=D2D_粒子.创建("Dat/爆炸.psi",粒子精灵),
						倒计时=50
					}
					table.insert(爆炸组,临时爆炸)
					table.remove(敌人子弹组,n)
					break
				end
			end
		end
		
		if(地图物件组[n].血量<0)then
			for x=1,5 do
				local 临时爆炸={
					x=地图x+地图物件组[n].x+引擎:取随机整数(-100,100),
					y=地图y+地图物件组[n].y+引擎:取随机整数(-100,100),
					类型=D2D_粒子.创建("Dat/爆炸.psi",粒子精灵),
					倒计时=50
				}
				table.insert(爆炸组,临时爆炸)
			end
			爆炸音效3:播放()
			if(地图物件组[n].类型=="指挥部")then
				任务计数=任务计数+1
			end
			table.remove(地图物件组,n)
			break
		end
		
		
	end
	
	----飞机
	for n=1,table.getn(飞机组) do
		
		飞机组[n].包围盒:置位置(地图x+飞机组[n].x-32,地图y+飞机组[n].y-32)
		
		飞机组[n].方向2=飞机组[n].方向2+引擎:取随机整数(50,100)
		飞机组[n].精灵:显示_高级(地图x+飞机组[n].x,地图y+飞机组[n].y,飞机组[n].方向*P,1,1)
		飞机组[n].精灵2:显示_高级(地图x+飞机组[n].x,地图y+飞机组[n].y,飞机组[n].方向2*P,1,1)
		
		
		if(飞机组[n].临时>0)then
			飞机组[n].临时=飞机组[n].临时-3
			飞机组[n].y=飞机组[n].y+3
		end
			
			----击中
		for m=1,table.getn(主角子弹组) do
			if(飞机组[n].包围盒:检测_点(主角子弹组[m].子弹.起点x+地图x,主角子弹组[m].子弹.起点y+地图y))then
				if(主角子弹组[m].类型==2)then
					break
				end
				if(主角子弹组[m].类型==1)then
					break
				end
				if(主角子弹组[m].类型==3)then
					飞机组[n].血量=飞机组[n].血量-50
				end
				local 临时爆炸={
					x=地图x+飞机组[n].x,
					y=地图y+飞机组[n].y,
					类型=D2D_粒子.创建("Dat/爆炸.psi",粒子精灵),
					倒计时=50
				}
				table.insert(爆炸组,临时爆炸)
				table.remove(主角子弹组,n)
				break
			end
		end
		
		----防碰撞
		for a=n+1,table.getn(飞机组) do
			if(引擎:包围盒碰撞检测(飞机组[n].包围盒,飞机组[a].包围盒))then
				飞机组[n].x1,飞机组[n].y1=取移动步幅(飞机组[n].方向+90)
				飞机组[n].x=飞机组[n].x-飞机组[n].x1*4
				飞机组[n].y=飞机组[n].y-飞机组[n].y1*4
				飞机组[a].x1,飞机组[a].y1=取移动步幅(飞机组[a].方向+90)
				飞机组[a].x=飞机组[a].x+飞机组[a].x1*4
				飞机组[a].y=飞机组[a].y+飞机组[a].y1*4
			end
		end
		
		----移动
		if(取距离平方(地图x+飞机组[n].x,地图y+飞机组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)>400*400)and(取距离平方(地图x+飞机组[n].x,地图y+飞机组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)<1000*1000)then
				
			if((取两点间角度(地图x+飞机组[n].x,地图y+飞机组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)+70)%360<飞机组[n].方向%360)and((取两点间角度(地图x+飞机组[n].x,地图y+飞机组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)+110)%360>飞机组[n].方向%360)then
				临时x,临时y=取移动步幅(飞机组[n].方向+90)
				飞机组[n].x=飞机组[n].x-临时x*2
				飞机组[n].y=飞机组[n].y-临时y*2
			else
				if((取两点间角度(地图x+飞机组[n].x,地图y+飞机组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)-飞机组[n].方向+90)%360>180)then
					飞机组[n].方向=飞机组[n].方向-2
				else	
					飞机组[n].方向=飞机组[n].方向+2
				end
			end
		end
		
		
		----攻击
		if(取距离平方(地图x+飞机组[n].x,地图y+飞机组[n].y,主角.主角.x+地图x,主角.主角.y+地图y)<500*500)then
				--攻击代码
				
			if(飞机组[n].攻击冷却<0)then
				local 子弹={
					子弹=扩展子弹类.创建(飞机组[n].x,飞机组[n].y,取两点间角度(地图x+飞机组[n].x,地图y+飞机组[n].y,主角.主角.x+地图x,主角.主角.y+地图y),D2D_精灵.创建(子弹图片3,0,0,24,24),6),
					射程=500,
					类型=3
				}
				table.insert(敌人子弹组,子弹)
				飞机组[n].攻击冷却=50
				子弹音效1:播放()
			else
				飞机组[n].攻击冷却=飞机组[n].攻击冷却-1
			end
		end
		
		
		
		if(飞机组[n].血量<0)then
			for x=1,5 do
				local 临时爆炸={
					x=地图x+飞机组[n].x+引擎:取随机整数(-100,100),
					y=地图y+飞机组[n].y+引擎:取随机整数(-100,100),
					类型=D2D_粒子.创建("Dat/爆炸.psi",粒子精灵),
					倒计时=50
				}
				table.insert(爆炸组,临时爆炸)
			end
			爆炸音效2:播放()
			table.remove(飞机组,n)
			break
		end
	end
	
	
	
	
	
	
	
	
	for n=1,table.getn(地雷组) do
		地雷组[n].精灵:显示(地图x+地雷组[n].x,地图y+地雷组[n].y)
		地雷组[n].包围盒:置位置(地图x+地雷组[n].x,地图y+地雷组[n].y)
	end
	
	--子弹
	for n=1,table.getn(主角子弹组) do
		主角子弹组[n].子弹:更新(时间)
		主角子弹组[n].射程=主角子弹组[n].射程-10
		主角子弹组[n].子弹:显示()
		if(主角子弹组[n].射程<0)then
			table.remove(主角子弹组,n)
			break
		end
	end
	
	for n=1,table.getn(敌人子弹组) do
		敌人子弹组[n].子弹:更新(时间)
		敌人子弹组[n].射程=敌人子弹组[n].射程-6
		敌人子弹组[n].子弹:显示()
		if(敌人子弹组[n].射程<0)then
			table.remove(敌人子弹组,n)
			break
		end
	end
	
	----胜负判断----
	if(主角.主角.血量<=0)then
		local 临时爆炸={
			x=地图x+主角.主角.x+引擎:取随机整数(-100,100),
			y=地图y+主角.主角.y+引擎:取随机整数(-100,100),
			类型=D2D_粒子.创建("Dat/爆炸.psi",粒子精灵),
			倒计时=50
		}
		table.insert(爆炸组,临时爆炸)
		爆炸音效1:播放()
		失败计时=失败计时+1
		if(失败计时>50)then
			游戏状态="输"
			失败:播放()
			失败计时=0
		end
	end
	
	if(任务计数>=任务总数)then
		
		胜利计时=胜利计时+1
		if(胜利计时>100)then
			胜利:播放()
			游戏状态="胜"
			胜利计时=0
		end
		
	end
	
	文字_描边显示(中字,0,0,"装甲强度",颜色_红,颜色_蓝)
	
	血量显示:显示(主角.主角.血量,160,0,20,40,255)
	
	文字_描边显示(中字,0,560,"剩余目标",颜色_蓝,颜色_红)
	
	血量显示:显示(任务总数-任务计数,160,560,20,40,255)
	
	end
	
	if(游戏状态=="清空")then
		清空(主角子弹组)
		清空(敌人子弹组)
		清空(地图物件组)
		清空(敌人组)
		清空(飞机组)
		清空(地雷组)
		if(table.getn(主角子弹组)==0)and(table.getn(敌人子弹组)==0)and(table.getn(地图物件组)==0)and(table.getn(敌人组)==0)and(table.getn(地雷组)==0)then
			游戏状态="载入地图"
		end
	end
	
	
	--特效
	for n=1,table.getn(爆炸组) do
		爆炸组[n].类型:启动到(爆炸组[n].x,爆炸组[n].y)
		爆炸组[n].类型:更新(时间)
		爆炸组[n].类型:显示(爆炸组[n].x,爆炸组[n].y)
		爆炸组[n].倒计时=爆炸组[n].倒计时-1
		if(爆炸组[n].倒计时<0)then
			table.remove(爆炸组,n)
			break
		end
	end
	
	
	
	渲染结束()
	return false
end









--===============================================================================
-- ■ 网络数据处理()
--===============================================================================
function 网络数据处理 (命令,参数1,参数2,附加)


end




--=============================================================================--
-- ■ 网络连接断开()
--=============================================================================--
function 网络连接断开 ()


end



--===============================================================================
-- ■ 屏幕获得焦点()
--===============================================================================
function 屏幕获得焦点 ()


	return false
end



--===============================================================================
-- ■ 屏幕失去焦点()
--===============================================================================
function 屏幕失去焦点 ()


	return false
end



--===============================================================================
-- ■ 屏幕关闭()
--===============================================================================
function 屏幕关闭 ()

	
	
	return true
end



--===============================================================================
-- ■ 渲染区保护()
--===============================================================================
function 渲染区保护 ()


	return false
end








